package br.unifor.aspect;

import br.unifor.onto.ServiceHelper;

import com.hp.hpl.jena.ontology.Individual;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.shared.PropertyNotFoundException;
import com.hp.hpl.jena.ontology.impl.OntResourceImpl;
import com.hp.hpl.jena.ontology.impl.IndividualImpl;
/*
 * Aspecto para interceptar chamada as propriedades das ontologias
 */
		
public privileged aspect Aspecto {
	
	/*
	 * Captura somente classe do tipo OntResourceImpl.
	 * Guarda referencia da classe na variavel ont.
	 */
	pointcut capturarClasseOntResource (OntResourceImpl ont) : target(ont); 
	
	/*
	 * Captura somente a chamada do metodo getPropertyValue.
	 */
	pointcut capturaMetodo(Property propriedade): 
		call(* *.getPropertyValue(Property)) && args(propriedade);
	
	/*
	 * Captura chamada ao metodo getProperty da classe OntResourceImpl.
	 */
	Object around(OntResourceImpl ont, Property propriedade): 
		capturaMetodo(propriedade) && !within(TargetRecipe +) && capturarClasseOntResource (ont) 
		{
		   System.out.println( "InterceptandoJ..." );
			try
			{
				if ( ServiceHelper.existActivelowlAnnotation( propriedade) )
					return ServiceHelper.invokeService( (Individual) ont,
							propriedade );
			}
			catch ( Exception e )
			{
				e.printStackTrace();
			}

			return ont.getRequiredProperty( propriedade ).getObject();
		}	
	
}
